home *** CD-ROM | disk | FTP | other *** search
/ MacHack 1997 / MacHack 1997.toast / Hacks / Hacks ’94 / [√] Distribution Restricted! / Steve Sisak / TMFutures / UFailure.h < prev   
Text File  |  1994-06-26  |  4KB  |  138 lines

  1. // UFailure.h
  2. // Copyright © 1984-1993 by Apple Computer Inc. All rights reserved.
  3.  
  4. #ifndef __UFAILURE__
  5. #define __UFAILURE__
  6.  
  7. #ifndef __SETJMP__
  8. #include <setjmp.h>
  9. #endif
  10.  
  11. #ifndef __TYPES__
  12. #include <Types.h>
  13. #endif
  14.  
  15. #if qDebug
  16. #include <string.h>
  17. #endif
  18.  
  19. #define qDebug 1
  20.  
  21. //----------------------------------------------------------------------------------------
  22. // This macro can be called on any variable to keep it out of a register. It is
  23. // used specifically in exception handling. Kludge to be used till volatile or
  24. // C++ exception handling is implemented.
  25. //----------------------------------------------------------------------------------------
  26.  
  27. #define VOLATILE(a) ((void) &a)
  28.  
  29.  
  30. //----------------------------------------------------------------------------------------
  31. // Max and min error number constants
  32. //----------------------------------------------------------------------------------------
  33.  
  34. #define minErr (-32768)
  35. #define maxErr (32767)
  36.  
  37.  
  38. //----------------------------------------------------------------------------------------
  39. // FailInfo
  40. //----------------------------------------------------------------------------------------
  41.  
  42. typedef struct FailInfo FailInfo, *FailInfoPtr;
  43.  
  44. struct FailInfo {
  45.     jmp_buf        savedState;
  46.     OSErr        error;
  47.     long        message;
  48.     FailInfo*    nextInfo;
  49. #if qDebug
  50.     short installed;
  51. #endif
  52.  
  53. };
  54.  
  55.  
  56.  
  57. //----------------------------------------------------------------------------------------
  58. // Global macro definitions
  59. //----------------------------------------------------------------------------------------
  60.  
  61. // The Try macro has taken the place of the FailInfo::Try method, for the
  62. // reason that the code has to _always_ be inline.  The decision as to
  63. // whether or not code is inlined is implemented very differently for various
  64. // compilers, and can be affected by options such as symbolics generation and
  65. // level of optimization.  Because this decision is so far out of our control,
  66. // the only real guarantee is to implement Try as a macro…
  67. //
  68. // The old way:
  69. //
  70. //         FailInfo fi;
  71. //         if (fi.Try())
  72. //         {
  73. //            …
  74. //
  75. // The new way:
  76. //         FailInfo fi;
  77. //         Try(fi)
  78. //         {
  79. //            …
  80. //
  81.  
  82. #define Try(f)                            \
  83.     f.nextInfo  = gTopHandler;            \
  84.     f.error        = noErr;                \
  85.     f.message    = 0;                    \
  86.     f.installed    = 1;                    \
  87.     gTopHandler    = &f;                    \
  88.     if (setjmp(f.savedState) == 0)
  89.  
  90.  
  91. //----------------------------------------------------------------------------------------
  92. // Global variable declarations
  93. //----------------------------------------------------------------------------------------
  94.  
  95. extern FailInfoPtr gTopHandler;
  96.  
  97.  
  98. //----------------------------------------------------------------------------------------
  99. // Global function declarations
  100. //----------------------------------------------------------------------------------------
  101.  
  102. void Assertion(const Boolean condition, const StringPtr description);
  103.  
  104. #define BuildMessage(lowWord, highWord) (((long)highWord << 16) | (lowWord & 0xFFFF))
  105.  
  106. void Failure(OSErr error, long message);
  107.  
  108. void FailMemError();
  109.  
  110. void FailResError();
  111.  
  112. void FailNewMessage(OSErr error, long oldMessage, long newMessage);
  113.  
  114. void FailNIL(void* p);
  115.  
  116. void FailNILResource(Handle r);
  117.  
  118. void FailOSErr(OSErr error);
  119.  
  120. Boolean ErrorIs(OSErr expectedError, OSErr error);
  121.  
  122. Boolean HandlerExists(FailInfoPtr testFailInfoPtr);
  123.  
  124. void Success(FailInfo* fi);
  125.  
  126. void ProgramBreak(const StringPtr grievance);
  127.  
  128. void ProgramReport(const StringPtr grievance, const Boolean breakInDebugger);
  129.  
  130. #define ReSignal(fi) Failure((fi)->error, (fi)->message)
  131.  
  132. //----------------------------------------------------------------------------------------
  133. // FailInfo inline method definitions
  134. //----------------------------------------------------------------------------------------
  135.  
  136.  
  137. #endif
  138.